Curso de ScriptVox Intermedirio - Aula 14 - Prof. Oswaldo Vernet - iNCE/UFRJ

Para esta aula, baixem a nova verso do interpretador.

J na primeira aula, uma importante melhoria da verso 6.0 do ScriptVox foi apresentada:
as expresses. Vimos que uma expresso  uma sentena que envolve operandos e operadores.
No momento da avaliao de uma expresso, os operandos resultam em valores e, a estes valores,
os operadores so aplicados, respeitada a precedncia, at que o valor final resultante da
avaliao  obtido.

Naquele momento, dispnhamos apenas dos tipos inteiro e cadeia e todos os nossos exemplos
basearam-se em operandos destes dois tipos. Agora que j estudamos o tipo lista, cumpre
retornar ao estudo das expresses e introduzir os operadores que se aplicam a operandos
deste tipo.

O operador "+" aplica-se, em princpio, a operandos inteiros; a sobrecarga para o
tipo cadeia modifica a semntica deste operador, que passa a significar concatenao.
Em alguns exemplos, examinamos o efeito deste operador em expresses mistas, envolvendo
um operando inteiro e outro cadeia. Nestas expresses, ocorrem converses entre tipos,
a fim de que a aplicao do operador seja sempre possvel.

O operador "+"  tambm sobrecarregado para o tipo lista, significando concatenao.
Concatenar duas listas produz como resultado tambm uma lista, cuja cardinalidade 
a soma das cardinalidades das duas. Os elementos desta lista resultante so os elementos
da lista mencionada  esquerda do operador "+" seguidos dos elementos da lista mencionada
 direta. O seguinte exemplo ilustra a concatenao entre listas:

cores := [ "amarelo", "azul", "laranja", "verde" ]
todas_as_cores := cores + [ "violeta", "verde", "prpura", "ocre", "gren" ]

O operador "+" est aplicado, neste exemplo, a duas listas: a primeira est armazenada
na varivel "cores" e a segunda  definida explicitamente mediante a enumerao de seus
elementos. O valor final armazenado na varivel "todas_as_cores" ser a lista:

[ "amarelo", "azul", "laranja", "verde", "violeta", "verde", "prpura", "ocre", "gren" ]

Observe que a ordem dos elementos  respeitada na formao da lista resultante
da concatenao. O elemento "verde" aparece repetido, pois, na concatenao de listas,
nenhum elemento  perdido.

Um ponto importante a observar  que o operador de concatenao aplicado a listas espera
sempre duas listas como operandos. Portanto, no  vlida a seguinte atribuio:

cores := cores + "roxo"

j que, neste exemplo, o operador  direita  uma cadeia e no uma lista. O resultado
desta expresso ser invlido.

O operador "-", at agora, significa apenas subtrao entre inteiros; ele no possui
sobrecarga para o tipo cadeia. Porm, aplicado a listas, este operador produz como
resultado tambm uma lista, constituda por todos os elementos da lista  esquerda
do operador que no aparecem na lista  direita do operador. Acompanhe o seguinte
exemplo:

cores := [ "amarelo", "azul", "laranja", "verde" ]
cores_feias := [ "roxo", "laranja", "lils", "amarelo" ]
cores_belas := cores - cores_feias

A varivel "cores_belas" armazenar o valor resultante da avaliao da expresso
situada  direita do smbolo de atribuio ":=", que consiste em uma diferena entre 
listas. A lista  esquerda do operador "-"  "cores" e possui em comum com a
lista "cores_feias",  direita, os elementos "laranja" e "amarelo", apenas. 
Portanto, o valor armazenado na varivel "cores_belas" ser a lista

[ "azul", "verde" ]

Observe que a ordem dos elementos na lista-diferena respeita a ordem dos elementos
na lista  esquerda do operador. Por isso, o elemento "azul" precede o elemento "verde".

O operador "*", at o momento, significa apenas multiplicao entre inteiros. 
Este operador tambm est sobrecarregado para o tipo lista, da seguinte forma:
a lista resultante conter apenas os elementos comuns entre a lista  esquerda
e a lista  direita do operador. Analise o exemplo:

minhas_cores := [ "amarelo", "azul", "laranja", "verde" ]
cores_feias := [ "roxo", "laranja", "lils", "amarelo" ]
suas_cores := minhas_cores * cores_feias

O valor final armazenado na varivel "suas_cores" ser a lista

[ "amarelo", "laranja" ]

j que estes so os elementos pertencentes simultaneamente s duas listas.
Observe, novamente, que a ordem dos elementos na lista resultante  ditada 
pela lista  esquerda do operador "*"; assim, "amarelo" deve preceder "laranja".

No mencionamos ainda neste curso os trs operadores de incluso que se
aplicam ao tipo cadeia e que esto documentados no manual antigo do ScriptVox.
So eles:  "=*", "*=" e "*=*". Vamos analisar a sobrecarga desses operadores para
o tipo lista.

O operador "=*"  lido da seguinte maneira: "comea por". Aplicado a cadeias, 
ele produz o resultado verdadeiro (o inteiro um) ou falso (o inteiro zero),
conforme a cadeia  direita seja ou no um prefixo da cadeia  esquerda do operador.
A sobrecarga para listas preserva exatamente esta semntica. Siga o exemplo:

minhas_cores := [ "amarelo", "azul", "laranja", "verde" ]
se minhas_cores =* [ "amarelo", "azul" ]
	escreve "SIM"
seno
	escreve "NO"
fim se

Neste exemplo, a palavra SIM ser escrita na tela, j que a lista  direita do
operador "=*"  um prefixo da lista  esquerda do operador.

O operador "*="  lido da seguinte maneira: "termina por". Aplicado a cadeias, 
ele produz o resultado verdadeiro (o inteiro um) ou falso (o inteiro zero),
conforme a cadeia  direita seja ou no um sufixo da cadeia  esquerda do operador.
A sobrecarga para listas preserva exatamente esta semntica. Siga o exemplo:

minhas_cores := [ "amarelo", "azul", "laranja", "verde" ]
se minhas_cores *= [ "laranja", "verde" ]
	escreve "SIM"
seno
	escreve "NO"
fim se

Neste exemplo, tambm ser escrita a palavra SIM na tela, pois a lista  direita do
operador "*="  um sufixo da lista  esquerda do operador.

O operador "*=*"  lido da seguinte maneira: "contm". Aplicado a cadeias,
ele produz o resultado verdadeiro (o inteiro um) ou falso (o inteiro zero),
conforme a cadeia  direita seja ou no uma subcadeia da cadeia  esquerda do operador.
Aplicado a listas, preserva exatamente esta semntica. Assim como nas cadeias,
para ser considerada uma sublista da lista que aparece  esquerda do operador "*=*",
os elementos da lista  direita devem ocorrer todos sequencialmente a partir de alguma 
posio da lista  esquerda, na mesma ordem em que aparecem na lista  direita. 
Siga o exemplo:

minhas_cores := [ "amarelo", "azul", "laranja", "verde" ]
se minhas_cores *=* [ "azul", "laranja" ]
	escreve "SIM"
seno
	escreve "NO"
fim se

Porm, no exemplo seguinte:

minhas_cores := [ "amarelo", "azul", "laranja", "verde" ]
se minhas_cores *=* [ "laranja", "amarelo" ]
	escreve "SIM"
seno
	escreve "NO"
fim se

seria escrita a palavra NO na tela, pois, embora os elementos "laranja" e
"amarelo" pertenam  lista  [ "amarelo", "azul", "laranja", "verde" ], nem a
sequencialidade nem a ordem so respeitadas.


EXERCCIOS

Exerccios de Estudo Dirigido

1.  Utilizando os operadores vistos acima, mostre como introduzir um elemento na 
    posio zero de uma lista, sem usar a funo INSERE.
2.  Mostre como anexar um elemento a uma lista usando o operador "+". 
3.  Os operadores "-" e "*", aplicados a listas, lembram de longe duas operaes 
    sobre conjuntos que estudamos na matemtica elementar. Quais so elas?
4.  Em que circunstncias o operador "-", aplicado a duas listas, produzir como
    resultado a lista vazia?
5.  Em que circunstncias o operador "*", aplicado a duas listas, produzir como
    resultado a lista vazia?
6.  Uma diferena essencial entre listas e conjuntos  que, nas listas, a ordem dos
    elementos  importante, ao passo que conjuntos no possuem qualquer ordem.
    Que outras diferenas voc percebe entre listas e conjuntos?
7.  Sem usar a funo POS, qual dos operadores acima estudados voc escolheria para 
    verificar se um elemento pertence a uma lista?  Como voc o usaria?  D um exemplo.
	

Exerccio de avaliao (enviar para scriptvox@gmail.com at o meio-dia de 8 de maro de 2012)

O objetivo deste exerccio  implementar as operaes sobre CONJUNTOS utilizando listas
em ScriptVox. Um conjunto ser representado por uma lista na qual no podem existir elementos
repetidos.

Para cada uma das cinco operaes discriminadas a seguir, voc dever escrever uma funo:

1. PRODUZIR o conjunto vazio
   Esta operao no espera parmetros e retorna, como resultado, o conjunto vazio.

2. VERIFICAR se um elemento pertence a um conjunto
   Esta operao espera dois parmetros: o primeiro  um elemento e o segundo  um conjunto.
   Ela deve retornar verdadeiro (o inteiro um) se o elemento pertencer ao conjunto ou falso
   (o inteiro zero) se o elemento no pertencer ao conjunto.
   
3. Computar a UNIO entre dois conjuntos
   Esta operao recebe dois parmetros, que so os conjuntos a serem unidos. 
   Ela deve retornar como resultado um conjunto, consistindo de todos os elementos que pertencem
   ao primeiro ou ao segundo conjunto.

4. Computar a INTERSEO entre dois conjuntos
   Esta operao recebe dois parmetros, que so os conjuntos cuja interseo se deseja obter. 
   Ela deve retornar como resultado um conjunto, consistindo de todos os elementos que pertencem
   ao primeiro e ao segundo conjunto.

5. Verificar se um conjunto  SUBCONJUNTO de outro
   Esta operao recebe dois parmetros, que so os dois conjuntos. 
   Ela deve retornar como resultado verdadeiro (o inteiro um) se todos os elementos do primeiro
   conjunto pertencerem tambm ao segundo conjunto ou falso (o inteiro zero), caso contrrio.
   
Para testar as suas funes, escreva um script que l dois arquivos, ambos contendo textos sem
pontuao. Durante a leitura, voc dever armazenar as palavras dos dois textos em dois conjuntos 
separados, de modo que o primeiro conjunto contenha todas as palavras do primeiro texto e o segundo
conjunto, as do segundo texto. Ao final, escreva na tela, uma por linha, as palavras que ocorrerem
nos dois textos.

Para facilitar, converta para maisculas as linhas dos dois arquivos durante a leitura.

Durante o processamento, manipule os conjuntos apenas atravs das cinco operaes definidas acima.
Assim, se desejarmos futuramente mudar a representao, utilizando outro tipo no lugar de listas para
representar os conjuntos, o corpo principal do script no dever precisar ser alterado.

Bom estudo! 

Oswaldo Vernet
